package com.itbaizhan.myproducer1;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*设置所有消息的存活时间，在队列中设置
对某消息设置存活时间，在发送消息时设置
* RabbitMQ可以设置消息的存活时间（Time To Live，简称TTL），
* 当消息到达存活时间后还没有被消费，会被移出队列。RabbitMQ可以对队列
* 的所有消息设置存活时间，也可以对某条消息设置存活时间。*/
//@Configuration  测试RabbitConfig3  要注释 否则报错误
public class RabbitmqConfig2 {
    private final String EXCHANGE_NAME="my_topic_exchange2";
    private final String QUEUE_NAME="my_queue2";
    //创建交换机  注意导入Exchange的包，
    @Bean("bootExchange2")  //spring容器中有很多交换机，加上id方便找到
    public Exchange getExchange(){
        return ExchangeBuilder
                .topicExchange(EXCHANGE_NAME)  //交换机类型
                .durable(true)  //是否持久化
                .build();
    }
    //创建队列
    @Bean("bootQueue2")
    public Queue getQueue(){

        return QueueBuilder
                .durable(QUEUE_NAME)
                .ttl(10000)  //设置队列消息存活时间10秒
                .build();
    }

    //交换机绑定队列  @Qualifier是从spring容器中拿对象
    @Bean
    public Binding bingMessageQueue(@Qualifier("bootExchange2") Exchange exchange,@Qualifier("bootQueue2")Queue queue){
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with("my_routing")
                .noargs();
    }
}
/*
* RabbitMQ消息投递的路径为：

生产者--->交换机--->队列--->消费者

在RabbitMQ工作的过程中，每个环节消息都可能传递失败，那么RabbitMQ是如何监听消息是否成功投递的呢？

确认模式（confirm）可以监听消息是否从生产者成功传递到交换机。
退回模式（return）可以监听消息是否从交换机成功传递到队列。
消费者消息确认（Consumer Ack）可以监听消费者是否成功处理消息。
* */

/*注意：

如果设置了单条消息的存活时间，也设置了队列的存活时间，以时间短的为准。

消息过期后，并不会马上移除消息，只有消息消费到队列顶端时，才会移除该消息。*/